package pt.ipleiria.estg.dei.ei.es2.bio;

import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.preference.PreferenceManager;
import android.test.ActivityInstrumentationTestCase2;
import android.widget.TextView;

import com.robotium.solo.Solo;

/**
 * Created by Utilizador on 05/03/2015.
 */
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {

    private Solo solo;
    public MainActivityTest() {
        super(MainActivity.class);
    }

    @Override
    public void setUp() throws Exception {
        solo = new Solo(getInstrumentation(),getActivity());
    }

    @Override
    public void tearDown() throws Exception {

        solo.finishOpenedActivities();
    }

        /*
    Dado que estou na aplicação, Quando pressiono o botão "I'm here" e as
    informações do meu contacto não estão preenchidas (pelo menos nome e
            email), Então deve ser-me exibida uma mensagem perguntando se pretendo
    preencher as informações do meu contacto ou cancelar a acção.*/

    public void testSemDadosContacto() throws Exception {
        showPreencherDados();

        //procurar mensagem titulo  -dialog com o tipo sem dados de contacto
        boolean result = solo.searchText(getActivity().getString(R.string.pretende_preencher_dados_contacto));

        assertTrue("A dialog nao aparece", result);
    }

    /*
    Dado que estou na aplicação, Quando pressiono o botão "I'm here" e as
    informações do meu contacto estão preenchidas (pelo menos nome e email),
    Então deve ser-me exibida uma mensagem de confirmação da activação desta
    funcionalidade.
     */

    public void testShowConfirmationDialog() throws Exception{
        //garantir acesso a app
        showConfirmationDialog();

        boolean result = solo.searchText("Confirmacao");

        assertTrue("Nao encontrei a mensagem de confirmacao", result);
    }

    /*
    Dado que estou na mensagem de confirmação da funcionalidade "I'm here",
    Quando pressiono no botão "Sim" e tenho rede, Então os meus dados devem
    ser submetidos e partilhados com os restantes participantes que activaram a
    funcionalidade "I'm here" e o botão deve mudar para o estado activo.*/
    public void testSimConfirmacao() throws Exception {
        solo.unlockScreen();
        //garantir que á rede
        solo.setWiFiData(true);

        //1 segundo
        solo.sleep(1000);
        showConfirmationDialog();

        //pressionar botao sim
        solo.clickOnButton(getActivity().getString(R.string.sim));

        //aguardar atividade nova a ser carregada
        solo.waitForActivity(ParticipantListActivity.class, 100);

        //compara a actividade onde esta com a que devia estar
        solo.assertCurrentActivity("Nao passou para a atividade participantes", ParticipantListActivity.class);

        //verificar que o icon corresponde ao checkin efetuado
        boolean obteinedResult = verifyIcon(R.drawable.ic_action_name2);

        assertTrue("O icone nao corresponde ao checkin efetuado", obteinedResult);
    }

    /*
    Dado que estou na mensagem de confirmação da funcionalidade "I'm here",
    Quando pressiono o botão "Não", Então deve ser exibido o ecrã inicial
    mantendo-se a funcionalidade "I'm here" desactivada.*/

    public void testNaoConfirmo() throws Exception {
        //cenario - apresentar mensagem de confirmacao
        showConfirmationDialog();

        //acao - pressionar botao "Não"
        solo.clickOnButton(getActivity().getString(R.string.nao));

        //garantir que estou no ecra inicial
        solo.assertCurrentActivity("Nao estou na Main", MainActivity.class);

        //garantir que o icon apresentado é o de nao checkin
        boolean result = verifyIcon(R.drawable.ic_action_name);

        assertTrue("Nao apresenta o icon solo", result);
    }

    /*
   Dado que estou a visualizar a mensagem perguntando se pretendo preencher as
   informações do meu contacto, Quando selecciono "Sim", Então devo ser
   reenchaminhado para o ecrã de preenchimento de detalhes do meu contacto
   PASSA SE CORREU INDIVIDUALMENTE

    */
    public void testSimPreencherDados() throws Exception {
        //cenario
        showPreencherDados();
        //acao
        solo.clickOnButton(getActivity().getString(R.string.sim));
        //resultado
        solo.waitForActivity(SettingsActivity.class);

        solo.assertCurrentActivity("Nao estou na Settings activity",SettingsActivity.class);

    }

    /*
    Dado que estou a visualizar a mensagem perguntando se pretendo preencher as
    informações do meu contacto, Quando selecciono "Não", Então deve ser
    exibido o ecrã inicial mantendo-se a funcionalidade "I'm here" desactivada.

     */
    public void testNaoPreencherDados() throws Exception {
        //cenario
        showPreencherDados();

        //acao
        solo.clickOnButton(getActivity().getString(R.string.nao));

        solo.assertCurrentActivity("Nao estou no Main", MainActivity.class);

        boolean result = verifyIcon(R.drawable.ic_action_name);

        assertTrue("Nao apresenta o icon solo", result);

    }

        /*
    Dado que estou no ecrã de preenchimento de detalhes do meu contacto,
    Quando termino o preenchimento dos dados, pressiono o botão de back, e
    tenho as informações do meu contacto preenchidas (pelo menos nome e email),
    Então deve-me ser exibida uma mensagem de confirmação da activação desta
    funcionalidade.
     */

    public void testPreencherDados() throws Exception {
        //cenario
        showPreencherDados();
        //pressionar o botao sim
        solo.clickOnButton(getActivity().getString(R.string.sim));
        //garantir que estou na settings activity
        solo.waitForActivity(SettingsActivity.class);
        solo.assertCurrentActivity("Nao estou na settings activity", SettingsActivity.class);
        //acao
        //garantir que tem dados preenchidos

        //para o nome
        solo.clickOnText(solo.getString(R.string.name));
        assertTrue("A caixa de dialog name nao apareceu",solo.waitForDialogToOpen(1000));

        solo.enterText(0, "TESTE");
        //indice 1
        solo.clickOnButton(1);
        assertTrue("A caixa de dialog nao desapareceu",solo.waitForDialogToClose(1000));

        //para o mail
        solo.clickOnText(solo.getString(R.string.email));
        assertTrue("A caixa de dialog name nao apareceu",solo.waitForDialogToOpen(1000));

        solo.enterText(0,"TESTE@EMAIL.COM");
        //indice 1
        solo.clickOnButton(1);
        assertTrue("A caixa de dialog nao desapareceu",solo.waitForDialogToClose(1000));
        //pressionar botao back
        solo.goBack();
        //resultado
        //garantir mensagem de confimraçao de check in
        solo.waitForActivity(MainActivity.class);
        solo.assertCurrentActivity("Nao passou ao Main", MainActivity.class);
        solo.waitForDialogToOpen(1000);
        solo.searchText(getActivity().getString(R.string.titleConfirmation));

    }

    /*
    Dado que estou na aplicação, Então o botão "I'm here" deve estar sempre visível
    e deve estar activo caso eu a funcionalidade "I'm here" esteja activa (e viceversa).
    FALHA
     */

    public void testCheckButton() throws Exception {
        solo.unlockScreen();

        solo.clickOnActionBarItem(R.id.action_checkin);
        solo.clickOnButton(1);
        //verificar que o icon corresponde ao checkin efetuado
        boolean Result = verifyIcon(R.drawable.ic_action_name2);
        assertTrue("O botao im here nao esta activo",Result);

        solo.clickOnActionBarItem(R.drawable.ic_action_name2);
        boolean resultado = verifyIcon(R.drawable.ic_action_name);
        assertTrue("O botao im here esta activado", resultado);
    }

    /*
    Dado que estou na aplicação, Quando o botão "I'm here" está activo, Então
    devo poder pressioná-lo de maneira a desactivar a funcionalidade "I'm here".
    VERIFICAR SE E ISTO
     */
/*
    public void testDesativarBotao() throws Exception {
        solo.unlockScreen();

        solo.clickOnActionBarItem(R.drawable.ic_action_name2);

        boolean Result = verifyIcon(R.drawable.ic_action_name);

        assertTrue("O botao nao modou", Result);

    }*/

    /*
    Dado que estou na mensagem de confirmação da funcionalidade "I'm here",
    Quando pressiono no botão "Sim" e não tenho rede, Então deve-me ser
    apresentada uma mensagem informativa a indicar a falta de rede
     */

    public void testNoNetwork() throws Exception {
        showConfirmationDialog();
        //garantir que nao á rede
        solo.setWiFiData(false);
        //1 segundo
        solo.sleep(1000);

        //acao pressionar botao sim
        solo.clickOnButton(getActivity().getString(R.string.sim));
        boolean result = solo.searchText(getActivity().getString(R.string.no_network));

        assertTrue("Nao apresenta mensagem de erro", result);

    }


    private void showConfirmationDialog() {
        //aceder a dialog de confirmacao
        solo.unlockScreen();
        //garantir que tenho dados de contacto
        setContactData("TESTE", "TESTE@EMAIL.COM");
        //pressionar botao checkin
        solo.clickOnActionBarItem(R.id.action_checkin);
    }

    private boolean verifyIcon(int ic_action_name2) {
        solo.waitForView(R.id.action_checkin);

        TextView v = (TextView) solo.getCurrentActivity().findViewById(R.id.action_checkin);

        Bitmap expected = ((BitmapDrawable) solo.getCurrentActivity().getDrawable(ic_action_name2)).getBitmap();

        Bitmap actual = ((BitmapDrawable) v.getCompoundDrawables() [0]).getBitmap();

        return expected.sameAs(actual);
    }

    private void setContactData(String nome, String email){
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());

        SharedPreferences.Editor editorPrefs = prefs.edit();
        editorPrefs.putString(getActivity().getString(R.string.name), nome);
        editorPrefs.putString(getActivity().getString(R.string.email), email);

        editorPrefs.commit();

    }


    private void showPreencherDados() {
        //aceder á app
        solo.unlockScreen();

        //garantir dados de contacto vazios
        setContactData("","");

        //pressionar botão
        solo.clickOnActionBarItem(R.id.action_checkin);
    }


}
